package labuladong.第三章.计算器;

import java.util.Stack;

public class Calculate {
    public static void main(String[] args) {
        String s = "(1+(1*2-1))+(1+2)";
        System.out.println(calcuate(s));
    }

    public static int calcuate(String s) {
        Stack<Character> stack = new Stack<>();
        // 入栈
        for(int i=s.length()-1; i>=0; i--){
            stack.push(s.charAt(i));
        }
        return calculate(stack);
    }

    public static int calculate(Stack<Character> s) {
        Stack<Integer> stk = new Stack<>();
        // 记录算式中的数字
        int num = 0;
        // 记录num前的符号，初始化为+
        char sign = '+';
        while (!s.isEmpty()){
            char c = s.pop();
            // 如果是数字，连续读到num
            if(isDigit(c)) {
                num = 10*num + (c - '0');
            }
            // 遇到左括号。开始递归计算
            if(c == '(') {
                num = calculate(s);
            }
            // 如果不是数字，就是遇到了下一个符号
            // 之前的数字和符号就要存进栈中
            if((!isDigit(c) && c!=' ') || s.size()==0) {
                switch (sign) {
                    case '+' : stk.push(num); break;
                    case '-' : stk.push(-num); break;
                    // 只要拿出前一个数字做对应运算即可
                    case '*' : stk.push(stk.pop() * num); break;
                    case '/' : stk.push(stk.pop() / num); break;
                }
                // 更新符号为当前符号，数字清零
                sign = c;
                num = 0;
            }
            // 遇到右括号，返回递归结果
            if(c == ')') {
                break;
            }
        }
        // 将栈中所有结果求和就是答案
        int res = 0;
        while (!stk.empty()) {
            res += stk.pop();
        }
        return res;
    }

    public static boolean isDigit(char c) {
        if (c >= '0' && c <= '9')
            return true;
        return false;
    }
}
